home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
TPUG - Toronto PET Users Group
/
TPUG Users Group CD
/
TPUG Users Group CD.iso
/
AMIGA
/
(A)Z
/
(A)Z11.ADF
/
LOGO
/
LOGOSOURCE
/
logoparse.c
< prev
next >
Wrap
C/C++ Source or Header
|
1987-07-21
|
5KB
|
282 lines
#include "logo.h"
extern int multnum,endflag,rendflag,topf;
extern char ibuf[];
extern char *ibufptr, *getbpt, charib;
extern int letflag,pflag;
#ifdef PAUSE
extern int pauselev;
#endif
extern FILE *pbuf;
extern struct lexstruct keywords[];
extern struct alist *locptr;
extern struct runblock *thisrun;
struct object *makeword(c)
int c;
{
register struct object* obj;
register char *s;
char str[100];
s=str;
do {
if (c == '\\') c = getchar()|0200;
else if (c == '%') c = ' '|0200;
*s++ = c;
} while((c=getchar())>0 && !index(" \t\n[]",c));
if (c<=0) {
printf("Unmatched [ in procedure.\n");
errhand();
}
charib = c;
*s = '\0';
obj = objcpstr(str);
if (nump(obj)) {
obj = numconv(localize(obj),"!makeword");
mfree(globcopy(obj)); /* unlocalize */
return(obj);
}
return(globcopy(obj));
}
struct object *makel1()
{
register struct object *head,*tail;
register c,cnt;
while ((c=getchar())==' ' || c=='\t' || c=='\n') ;
if(c==']') {
charib = c;
return ((struct object *)0);
}
if (c<=0) {
printf("Unmatched [ in procedure.\n");
errhand();
}
head = (struct object*)ckmalloc(sizeof(struct object));
tail = head;
cnt = 0;
head->obtype = CONS;
head->refcnt = 0;
head->obcdr = 0;
loop:
if (c=='[') {
tail->obcar = globcopy(makel1());
getchar(); /* gobble the peeked close bracket */
} else {
tail->obcar = makeword(c);
/* This used to use charib instead of passing the char as
* an argument, but that loses if the first char of a word
* is backslash, in which case something is already in
* charib from getchr1. */
}
while ((c=getchar())==' ' || c=='\t' || c=='\n') ;
if (c==']') {
charib = c;
return (head);
}
if (c<=0) {
printf("Unmatched [ in procedure.\n");
errhand();
}
tail->obcdr = (struct object*)ckmalloc(sizeof(struct object));
tail = tail->obcdr;
tail->obtype = CONS;
tail->refcnt = 1;
tail->obcdr = 0;
goto loop;
}
struct object *makelist()
{
return(localize(makel1()));
}
#ifdef DEBUG
getchr1()
#else
getchar()
#endif
{
FAST c;
#ifdef AMIGA
extern int quitsig;
if (quitsig) {
quitsig = 0;
sigquit();
}
#endif
if (charib) {
c=charib;
charib=0;
return(c);
}
else if (pflag==1) {
while ((c=getc(pbuf))=='\r')
;
if (c=='\\' && letflag!=1) { /* continuation line feature */
c=getc(pbuf);
if (c=='\n') c=getc(pbuf);
else {
charib = c;
c = '\\';
}
}
if (!letflag && c>='A' && c<='Z') c+= 32;
return(c);
}
else if (getbpt) { /* BH 5/19/81 moved down below pflag test */
c = *getbpt++;
if (c) return (c);
if (!thisrun) {
getbpt = 0;
return('\n');
} /* startup file feature */
--getbpt;
if (--(thisrun->rcount) <= 0) {
if (!rendflag) rendflag = 1; /* BH 3/17/83 */
return(0);
} else {
rerun();
return('\n');
}
}
else if (ibufptr==NULL) {
rebuff:
if ((c=read(0,ibuf,IBUFSIZ))==IBUFSIZ)
if (ibuf[IBUFSIZ-1]!='\n') {
while (read(0,ibuf,IBUFSIZ)==IBUFSIZ)
if (ibuf[IBUFSIZ-1]=='\n') break;
puts("Your line is too long.");
errhand();
}
if (c<0) {
/* Error return from read. Probably signal. */
return ('\n');
}
if (c==0) {
/* Not clear what's right for EOF. I'd just ignore it
only what if stdin is a file, we'll loop forever.
Compromise: if we're paused, don't lose the valuable
context with a keystroke, otherwise, exit. */
#ifdef PAUSE
if (pauselev) return('\n');
#endif
leave(3);
}
ibufptr=ibuf;
}
c= *ibufptr++;
if (c=='\\' && letflag!=1) { /* continuation line feature */
c = *ibufptr++;
if (c=='\n') {
ibufptr=NULL;
goto rebuff; /* sorry, Jay */
} else {
charib = c;
c = '\\';
}
}
if (!letflag && c>='A' && c<='Z') c+=32;
if (c=='\n') ibufptr=NULL;
return(c);
}
#ifdef DEBUG
getchar()
{ /* BH 3/23/80 debugging echo output */
register c;
c = getchr1();
if (memtrace) putchar(c);
return(c);
}
#endif
struct object *multiop(op,args)
register op;
register struct object *args;
{
extern struct object *list();
if (keywords[op].lexval==list) return (localize(args));
else if (multnum<2) {
nputs(keywords[op].word);
puts(" needs at least two inputs.");
errhand();
} else if (multnum==2)
return ((*keywords[op].lexval)(localize(args->obcar),
localize(args->obcdr->obcar)));
else {
multnum--;
return ((*keywords[op].lexval)(localize(args->obcar),
multiop(op,args->obcdr)));
}
}
struct object *pots()
{
#ifndef AMIGA
register f;
if (f=fork()) while (wait(0)!=f) ;
else {
execl ("/bin/sh","sh","-c",POTSCMD,0);
exit();
}
#else
char pat[10], buf[128], *fn, *scdir();
FILE *fp;
pat[0] = '*';
strcpy(&pat[1], EXTEN);
while (fn = scdir(pat)) {
fp = fopen(fn, "r");
if (fp) {
fgets(buf,128,fp);
printf("%s", buf);
fclose(fp);
}
}
#endif
return((struct object *)-1);
}
lbreak() {
#ifdef PAUSE
if (!pflag && thisrun && thisrun->str==(struct object *)(-1))
unpause();
#endif
if (!pflag && thisrun) {
rendflag = 1; /* BH 3/17/83 */
if (thisrun->rprev && !(thisrun->svpflag)) rendflag++;
}
}
lstop() {
endflag = 1;
#ifdef PAUSE
if (!pflag && thisrun && thisrun->str==(struct object *)(-1))
unpause();
#endif
if (!pflag && thisrun) rendflag = 3; /* BH 3/17/83 */
}
ltopl() {
topf=1;
errwhere();
errzap();
leave(1);
}
lbyecom() {
leave(3);
}